Add convenience helpers to map source ids
authorAlex Crichton <alex@alexcrichton.com>
Tue, 2 Feb 2016 17:36:29 +0000 (09:36 -0800)
committerAlex Crichton <alex@alexcrichton.com>
Mon, 1 Aug 2016 17:11:20 +0000 (10:11 -0700)
Should help easily mapping packages from one source to another

src/cargo/core/dependency.rs
src/cargo/core/manifest.rs
src/cargo/core/package.rs
src/cargo/core/package_id.rs
src/cargo/core/summary.rs

index 08966e6e4382072662c0c2f846485a96c82ca6a5..48f4bd456d99f1de892e2c289d6f56f7e3313d0b 100644 (file)
@@ -249,6 +249,7 @@ impl Dependency {
     pub fn is_transitive(&self) -> bool { self.inner.is_transitive() }
     pub fn is_build(&self) -> bool { self.inner.is_build() }
     pub fn is_optional(&self) -> bool { self.inner.is_optional() }
+
     /// Returns true if the default features of the dependency are requested.
     pub fn uses_default_features(&self) -> bool {
         self.inner.uses_default_features()
@@ -263,6 +264,17 @@ impl Dependency {
     pub fn matches_id(&self, id: &PackageId) -> bool {
         self.inner.matches_id(id)
     }
+
+    pub fn map_source(self, to_replace: &SourceId, replace_with: &SourceId)
+                      -> Dependency {
+        if self.source_id() != to_replace {
+            self
+        } else {
+            Rc::try_unwrap(self.inner).unwrap_or_else(|r| (*r).clone())
+               .set_source_id(replace_with.clone())
+               .into_dependency()
+        }
+    }
 }
 
 impl Platform {
index a4b401df0315a31d8bc441a88228ee0350a816be..02e9b4527df651237cdcd38e8e05fad49c6a9b64 100644 (file)
@@ -4,7 +4,8 @@ use std::path::{PathBuf, Path};
 use semver::Version;
 use rustc_serialize::{Encoder, Encodable};
 
-use core::{Dependency, PackageId, PackageIdSpec, Summary, WorkspaceConfig};
+use core::{Dependency, PackageId, Summary, SourceId, PackageIdSpec};
+use core::WorkspaceConfig;
 use core::package_id::Metadata;
 
 pub enum EitherManifest {
@@ -232,6 +233,14 @@ impl Manifest {
     pub fn set_summary(&mut self, summary: Summary) {
         self.summary = summary;
     }
+
+    pub fn map_source(self, to_replace: &SourceId, replace_with: &SourceId)
+                      -> Manifest {
+        Manifest {
+            summary: self.summary.map_source(to_replace, replace_with),
+            ..self
+        }
+    }
 }
 
 impl VirtualManifest {
index 112d68b0653ce6da0628ea75143b830fc69fb297..ffd5c93640aa220e9b5e876cf11a0df8a5eabca2 100644 (file)
@@ -99,6 +99,14 @@ impl Package {
                                     .filter(|&(d, _)| d < 4);
         matches.min_by_key(|t| t.0).map(|t| t.1)
     }
+
+    pub fn map_source(self, to_replace: &SourceId, replace_with: &SourceId)
+                      -> Package {
+        Package {
+            manifest: self.manifest.map_source(to_replace, replace_with),
+            manifest_path: self.manifest_path,
+        }
+    }
 }
 
 impl fmt::Display for Package {
index dfba5d7c6dd19d8edeb673c63cbf9fa7f6203190..8f682d48c09bdac6f90b329e95abb5f0001fc9b3 100644 (file)
@@ -157,6 +157,16 @@ impl PackageId {
             }),
         }
     }
+
+    pub fn with_source_id(&self, source: &SourceId) -> PackageId {
+        PackageId {
+            inner: Arc::new(PackageIdInner {
+                name: self.inner.name.to_string(),
+                version: self.inner.version.clone(),
+                source_id: source.clone(),
+            }),
+        }
+    }
 }
 
 impl Metadata {
index 419cc05d5235f373c0f3bdd94a4e7b02a4e115db..81169c54da8ed7442b1c0ec2b006cff196dea130 100644 (file)
@@ -81,6 +81,19 @@ impl Summary {
         self.dependencies = deps.into_iter().map(f).collect();
         self
     }
+
+    pub fn map_source(self, to_replace: &SourceId, replace_with: &SourceId)
+                      -> Summary {
+        let me = if self.package_id().source_id() == to_replace {
+            let new_id = self.package_id().with_source_id(replace_with);
+            self.override_id(new_id)
+        } else {
+            self
+        };
+        me.map_dependencies(|dep| {
+            dep.map_source(to_replace, replace_with)
+        })
+    }
 }
 
 impl PartialEq for Summary {